
#include "nane/ScriptSystem/ScriptObject.h"
#include "nane/ScriptSystem/ScriptObjectImpl_.h"
#include "nane/ScriptSystem/ScriptModuleImpl_.h"

#include "nane/core/assert.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ScriptObject::ScriptObject( const NullType& )
        : SubSystemProduct()
        , m( NULL )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ScriptObject::ScriptObject( Implementation* _impl )
        : SubSystemProduct( _impl )
        , m( _impl )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ScriptObject::ScriptObject( const ScriptObject& _other )
        : SubSystemProduct( _other )
        , m( _other.m )
    {
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    const char* ScriptObject::ToString()
    {
        return m->interface->ToString();
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool ScriptObject::InvokeImpl_( IInput* _args, IOutput* _results )
    {
        return m->interface->Invoke(_args, _results);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ScriptObject ScriptObject::ObjectUnwrapper<ScriptObject>::Unwrap( ScriptObject* _this, IScriptObject* _object )
    {
        return ScriptObject(new ScriptObject::Implementation(_this->m->creator, _object));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    const EScriptValueType ScriptWrapT<ScriptObject>::Type()
    {
        return EScriptValueType::Object;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    void ScriptWrapT<ScriptObject>::SetValue( TScriptValue& _scriptValue, EScriptValueType _type, ScriptObject _value )
    {
        NANE_ASSERT_R( _value != NullPtr, "ScriptObjectPtr must be valid" );
        if( _type == EScriptValueType::Object )
        {
            _scriptValue.o = _value.m->interface;
        }
        else
        {
            // error
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
